package com.aliyun.inventory.client.service;

import javax.validation.constraints.Min;

import com.aliyun.commons.model.Result;
import com.aliyun.inventory.client.model.InventoryDTO;
import org.springframework.validation.annotation.Validated;

/**
 * 库存服务
 *
 * 
 * @date 2024/11/27
 */
@Validated
public interface InventoryService {

    /**
     * 获取库存
     *
     * @param productId 商品 ID
     * @return {@link Result }<{@link Long }>
     */
    Result<InventoryDTO> getInventory(@Min(value = 1, message = "商品ID无效") long productId);

    /**
     * 获取剩余库存 数量
     *
     * @param productId 商品 ID
     * @return {@link Result }<{@link Integer }>
     */
    Result<Integer> getRemainQuantity(@Min(value = 1, message = "商品ID无效") long productId);

    /**
     * 获取用户已经购买数量
     *
     * @param productId 商品 ID
     * @param userId    用户 ID
     * @return {@link Result }<{@link Integer }>
     */
    Result<Integer> getUserPurchasedQuantity(@Min(value = 1, message = "商品ID无效") long productId,
        @Min(value = 1, message = "用户ID无效") long userId);

    /**
     * 扣减库存
     *
     * @param userId            用户 ID
     * @param productId         商品 ID
     * @param deductionQuantity 扣减数量
     */
    Result<Void> deductInventory(@Min(value = 1, message = "用户ID无效") long userId,
        @Min(value = 1, message = "商品ID无效") long productId,
        @Min(value = 1, message = "库存数量无效") int deductionQuantity);

    /**
     * 重置缓存
     *
     * @param productId 商品 ID
     * @param userId    用户ID
     * @return {@link Result }<{@link Void }>
     */
    Result<Void> resetCache(long productId, long userId);
}